package com.zgs.mall.order.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

/**
 * feign 请求会丢失 浏览器请求过来的 header信息
 * 原因：1.feign在调起远程请求的时候的是重新创建了一个 request请求
 * 解决：
 *   源码里看到 在发起请求前会先调用各种 拦截器 来扩展 请求 功能
 * 通过添加 拦截器 RequestInterceptor
 *使用RequestContextHolder 来获取当前线程的请求上下文   给feign请求模板添加上 header信息
 *
 *
 * 由于RequestContextHolder是在ThreadLocal模式下获取的请求上下文，所有在使用多线程异步模式下要
 * 做个修改，要将 RequestContextHolder 获取的主线线程的请求上下文 分别复制一份到多线程里
 *   RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
 *         RequestContextHolder.setRequestAttributes(requestAttributes);
 *
 */
@Configuration
public class FeignConfig  {

    @Bean
    public RequestInterceptor requestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                //拿到刚进来的请求
                ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                if (requestAttributes !=null){
                    HttpServletRequest request = requestAttributes.getRequest();//老请求
                    String cookie = request.getHeader("Cookie");
                    //同步请求头数据
                    template.header("Cookie",cookie);
                }

            }
        };
    }
}
